/*-----------------------------------------------File Info------------------------------------------------
** File Name:               SerialFalshSubarea.c  
** Last modified date:      20170316
** Last version:            V0.1
** Description:             
**--------------------------------------------------------------------------------------------------------            
** Created date:            2016.09.07
** author:                  YLY
** Version:                 V0.1
** Descriptions:            FLASH分区 
**--------------------------------------------------------------------------------------------------------
*/
#ifndef _SERIAL_FLASH_SUBAREA_H_
#define _SERIAL_FLASH_SUBAREA_H_  
#include <stdio.h>
#include "userConfig.h"



/* ----------------------------------------------------------------------------------------- */
/* 	人为将Flash分为18个分区，0－15分区用来存储数据检验值与分区号相同的数据， 				 */
/* 	16分区用于存储0-15分区无法存储的数据，17分区用于存储前16分区的存储情况标识。 			 */
/* ----------------------------------------------------------------------------------------- */

/* ----------------------------------25VF040,4Mbit=512KB---------------------------------------------- */
#define	VF040_SUBAREA_BYTE_SIZE	   		28672  	/* 28KB*1024,前16分区28K,每一个分区大小必需能被4KB整除 458752 */
#if VF040_SUBAREA_BYTE_SIZE % 0x1000 != 0	/* 最小扇区为4K Byte大小, */
	#error "pleaseCheck( VF040_SUBAREA_BYTE_SIZE )"
#endif	

#define	VF040_PUBLIC_SUBAREA_BYTE_SIZE	57344  	/* 公共分区分区大小64KB-标识分区大小8K＝56K*1024 */
#if VF040_PUBLIC_SUBAREA_BYTE_SIZE % 0x1000 != 0	/* 最小扇区为4K Byte大小, */
	#error "pleaseCheck( VF040_SUBAREA_BYTE_SIZE )"
#endif	

#define	VF040_PENULT_SECTOR_ADDRESS	  	0x7E000	/* 倒数等二个扇区（4K空间）的首地址	0X7FFFF+1-0X1000*2=0X7E000 */
#if VF040_PENULT_SECTOR_ADDRESS % 0x1000 != 0	/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF040_PENULT_SECTOR_ADDRESS )"
#endif

#define	VF040_LAST_SECTOR_ADDRESS		0x7F000	/* 最后一个扇区（4K空间）的首地址	0X7FFFF+1-0X1000=0X7F000 */
#if VF040_LAST_SECTOR_ADDRESS % 0x1000 != 0		/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF040_LAST_SECTOR_ADDRESS )"
#endif

#if VF040_SUBAREA_BYTE_SIZE*16 + VF040_PUBLIC_SUBAREA_BYTE_SIZE + 8192 != 4*1024*1024/8	/* 524288 */
	#error "pleaseCheck( VF040_SUBAREA_QUEUE )"
#endif
#define VF040_SUBAREA_QUEUE    {VF040_SUBAREA_BYTE_SIZE, 			\
								VF040_SUBAREA_BYTE_SIZE/8, 			\
								VF040_PUBLIC_SUBAREA_BYTE_SIZE, 	\
								VF040_PUBLIC_SUBAREA_BYTE_SIZE/8, 	\
								VF040_PENULT_SECTOR_ADDRESS, 		\
								VF040_LAST_SECTOR_ADDRESS}

/* -----------------------------------25VF080-8Mbit=1024KB-------------------------------------------- */			
#define	VF080_SUBAREA_BYTE_SIZE	   	57344  		/* 56KB*1024＝57344BYTE ,前16分区56K,最后一个分区128KB，每一个分区大小必需能被4KB整除 */
#if VF080_SUBAREA_BYTE_SIZE % 0x1000 != 0		/* 最小扇区为4K Byte大小, */
	#error "pleaseCheck( VF080_SUBAREA_BYTE_SIZE )"
#endif	

#define	VF080_PUBLIC_SUBAREA_BYTE_SIZE	122880  	/* 公共分区分区大小128KB-标识分区大小8K＝120K*1024 */
#if VF080_PUBLIC_SUBAREA_BYTE_SIZE % 0x1000 != 0	/* 最小扇区为4K Byte大小, */
	#error "pleaseCheck( VF080_PUBLIC_SUBAREA_BYTE_SIZE )"
#endif	


#define	VF080_PENULT_SECTOR_ADDRESS	  	0xFE000	/* 倒数等二个扇区（4K空间）的首地址	0XFFFFF+1-0X1000*2=0XFE000 */
#if VF080_PENULT_SECTOR_ADDRESS % 0x1000 != 0	/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF080_PENULT_SECTOR_ADDRESS )"
#endif
								
#define	VF080_LAST_SECTOR_ADDRESS		0xFF000	/* 最后一个扇区（4K空间）的首地址	0XFFFFF+1-0X1000=0XFF000 */
#if VF080_LAST_SECTOR_ADDRESS % 0x1000 != 0		/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF080_LAST_SECTOR_ADDRESS )"
#endif	

#if VF080_SUBAREA_BYTE_SIZE*16 + VF080_PUBLIC_SUBAREA_BYTE_SIZE + 8192 != 8*1024*1024/8	/* 1048576 */
	#error "pleaseCheck( VF040_SUBAREA_QUEUE )"
#endif														
#define VF080_SUBAREA_QUEUE    {VF080_SUBAREA_BYTE_SIZE, 			\
								VF080_SUBAREA_BYTE_SIZE/8, 			\
								VF080_PUBLIC_SUBAREA_BYTE_SIZE, 	\
								VF080_PUBLIC_SUBAREA_BYTE_SIZE/8, 	\
								VF080_PENULT_SECTOR_ADDRESS,     	\
								VF080_LAST_SECTOR_ADDRESS}	

/* ------------------------------------25VF016-16Mbit=2048KB-------------------------------------------*/	
#define	VF016_SUBAREA_BYTE_SIZE	   	114688  					/* 112KB*1024,前16分区84K,最后一个分区202KB，每一个分区大小必需能被4KB整除, */
#if VF016_SUBAREA_BYTE_SIZE % 0x1000 != 0						/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF016_SUBAREA_BYTE_SIZE )"
#endif	
								
#define	VF016_PUBLIC_SUBAREA_BYTE_SIZE	253952  		/* 公共分区分区大小256KB-标识分区大小8K＝248K*1024 */
#if VF016_PUBLIC_SUBAREA_BYTE_SIZE % 0x1000 != 0		/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF016_PENULT_SECTOR_ADDRESS )"
#endif	
								
#define	VF016_PENULT_SECTOR_ADDRESS	  	0x1FE000		/* 倒数等二个扇区（4K空间）的首地址	0X1FFFFF+1-0X1000*2=0X1FE000 */
#if VF016_PENULT_SECTOR_ADDRESS % 0x1000 != 0			/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF016_PENULT_SECTOR_ADDRESS )"
#endif
								
#define	VF016_LAST_SECTOR_ADDRESS		0x1FF000		/* 最后一个扇区（4K空间）的首地址	0X1FFFFF+1-0X1000=0X1FF000  */
#if VF016_LAST_SECTOR_ADDRESS % 0x1000 != 0				/* 最小扇区为4K Byte大小 */
	#error "pleaseCheck( VF016_LAST_SECTOR_ADDRESS )"
#endif
#if VF016_SUBAREA_BYTE_SIZE*16 + VF016_PUBLIC_SUBAREA_BYTE_SIZE + 8192 != 16*1024*1024/8	/* 2097152 */
	#error "pleaseCheck( VF016_SUBAREA_BYTE_SIZE )"
#endif	
#define VF016_SUBAREA_QUEUE    {VF016_SUBAREA_BYTE_SIZE,			\
								VF016_SUBAREA_BYTE_SIZE/8,			\
								VF016_PUBLIC_SUBAREA_BYTE_SIZE,		\
								VF016_PUBLIC_SUBAREA_BYTE_SIZE/8, 	\
								VF016_PENULT_SECTOR_ADDRESS,		\
								VF016_LAST_SECTOR_ADDRESS}			
	
/* --------------------------------------------------------------------------------------------	*/
typedef struct strSerialFlash
{
	uint32_t uiSubareaByteSize;					/* 前16个分区,每个分区大小Byte */
	uint32_t uiSubareaCardNum;					/* 前16个分区,每个分区可存卡数量 */
	uint32_t uiPublicSubareaByteSize;			/* 公共分区大小 */
	uint32_t uiPublicSubareaCardNum;			/* 公共分区可存卡数量 */
	uint32_t uiPenultSectorAddress;				/* 倒数第二扇区起始地址 */	
	uint32_t uiLastSectorAddress;				/* 最后一个扇区起始地址 */	
}tsSerialFlash;											
extern tsSerialFlash tgFlash;












extern void vSerialFlashSubareaInit(void);




#endif





